package org.example.servlet;


//作为模板复制粘贴去用  5.16
import org.example.dao.UserDao;
import org.example.exception.AppException;
import org.example.model.User;
import org.example.util.Util;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;

@WebServlet("/login")
public class LoginServlet extends HttpServlet {
    //检测登录状态  项目启动后就执行
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        req.setCharacterEncoding("UTF-8");
        resp.setCharacterEncoding("UTF-8");
        resp.setContentType("application/json");

        //后端响应的数据；根据接口文档User类中包含了指定的字段
        User user = new User();
        //获取当前用户的session，并获取用户信息，如果获取不到返回 ok：false
        HttpSession session = req.getSession(false);
        if(session != null){
            User get = (User)session.getAttribute("user");
            if(get != null){
                //已经登录，获取到用户信息
                user = get;
                user.setOk(true);
                resp.getWriter().println(Util.serialize(user));
                return ;
            }
        }
        user.setOk(false);  //可以不用设置，Ok字段默认为false
        user.setReason("用户未登录！");
        //服务端返回响应数据给前端  (业务处理可能引发异常，但无论怎样，都需要返回前端）
        //从响应对象获取输出流，打印输出到响应体body
        resp.getWriter().println(Util.serialize(user));
    }



    //登录接口
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        req.setCharacterEncoding("UTF-8");
        resp.setCharacterEncoding("UTF-8");
        resp.setContentType("application/json");

        //后端响应的数据；根据接口文档User类中包含了指定的字段
        User user = new User();
        try{
            //1.解析前端请求数据   使用反序列化操作
            User input = Util.deserialize(req.getInputStream(),User.class);  //用户输入的数据

            //2.业务处理   数据库验证用户名和密码 ，验证通过则创建用户session
            User query = UserDao.queryByName(input.getName());  //根据用户输入的数据在数据库查询，query为查找后的都对象
            if(query == null){
                throw new AppException("用户不存在！");   //异常被catch语句捕获
            }
            if(!query.getPassword().equals(input.getPassword())){
                throw new AppException("账号或者密码输入错误！");
            }

            //账号和密码输入正确
            HttpSession session = req.getSession();
            session.setAttribute("user",query);  //设置的是数据库查出来的对象！！！
            user = query;
            user.setOk(true);   //操作成功 ok：true
        }catch(Exception e){
            e.printStackTrace();
            //构造操作失败错误信息；ok：false, reason：错误信息
            user.setOk(false);
            if(e instanceof AppException){
                user.setReason(e.getMessage());  //设置错误信息
                //非自定义异常
            }else{
                user.setReason("非常抱歉，未知的错误，请联系管理员！");
            }
        }

        //3.服务端返回响应数据给前端  (业务处理可能引发异常，但无论怎样，都需要返回前端）
        //从响应对象获取输出流，打印输出到响应体body
        resp.getWriter().println(Util.serialize(user));
    }
}
